package ar.com.ctrln.persistence.model.contacto;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.apache.commons.lang.builder.HashCodeBuilder;

import ar.com.ctrln.persistence.model.organizacion.Organizacion;
import ar.com.ctrln.persistence.model.persona.AbstractPersona;
import ar.com.ctrln.persistence.model.persona.Direccion;
import ar.com.ctrln.persistence.model.persona.Telefono;
import ar.com.ctrln.persistence.model.sistema.cuentas.Usuario;

@Entity
@Table(name = "CONTACTO")
public class Contacto extends AbstractPersona {

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinTable(name = "DIRECCIONES_CONTACTO", joinColumns = { @JoinColumn(name = "id_persona") }, inverseJoinColumns = { @JoinColumn(name = "id_direccion") })
	private Set<Direccion> direcciones;

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinTable(name = "TELEFONOS_CONTACTO", joinColumns = { @JoinColumn(name = "id_persona") }, inverseJoinColumns = { @JoinColumn(name = "id_telefono") })
	private Set<Telefono> telefonos;

	@ManyToOne
	@JoinColumn(name = "id_organizacion")
	private Organizacion organizacion;

	@OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name="id_usuario")
	private Usuario usuario;

	@Override
	public Set<Direccion> getDirecciones() {
		return direcciones;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	@Override
	public void setDirecciones(Set<Direccion> direcciones) {
		this.direcciones = direcciones;
	}

	@Override
	public Set<Telefono> getTelefonos() {
		return telefonos;
	}

	@Override
	public void setTelefonos(Set<Telefono> telefonos) {
		this.telefonos = telefonos;
	}

	public void setOrganizacion(Organizacion organizacion) {
		this.organizacion = organizacion;
	}

	public Organizacion getOrganizacion() {
		return organizacion;
	}

	@Override
	public boolean equals(Object obj) {

		return (obj instanceof Contacto && getId() == ((Contacto) obj).getId());
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder(17, 37).append(getNombre())
				.append(getApellido()).toHashCode();
	}
}
